home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Software Contest 3
/
FM Towns Software Contest 3.iso
/
exp
/
astral
/
a1
/
game
/
source
/
roll.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-01-07
|
1KB
|
51 lines
#include "wire3d.h"
#include "sin.dat"
#include <stdio.h>
void roll(int *s_point,int *d_point,unsigned char *angle,int *offset)
{
int point_w[4][3];
int z_w;
#ifdef TEST
printf("s:x=%4d,y=%4d,z=%4d\n",s_point[0],s_point[1],s_point[2]);
#endif
point_w[0][0]=s_point[0];
point_w[0][1]=s_point[1];
point_w[0][2]=s_point[2];
/* X軸の回転 */
point_w[1][0]= point_w[0][0];
point_w[1][1]=(point_w[0][1]*cos[angle[0]]+point_w[0][2]*sin[angle[0]])>>16;
point_w[1][2]=(-point_w[0][1]*sin[angle[0]]+point_w[0][2]*cos[angle[0]])>>16;
/* Y軸の回転 */
point_w[2][0]=(point_w[1][0]*cos[angle[1]]-point_w[1][2]*sin[angle[1]])>>16;
point_w[2][1]= point_w[1][1];
point_w[2][2]=(point_w[1][0]*sin[angle[1]]+point_w[1][2]*cos[angle[1]])>>16;
/* Z軸の回転 */
point_w[3][0]=((point_w[2][0]*cos[angle[2]]+point_w[2][1]*sin[angle[2]])>>16)+offset[0];
point_w[3][1]=((-point_w[2][0]*sin[angle[2]]+point_w[2][1]*cos[angle[2]])>>16)+offset[1];
point_w[3][2]= point_w[2][2]+offset[2];
/* 視角の調整 */
z_w=point_w[3][2]*SIGHT_ANGLE+65536;
#ifdef TEST
printf("z_w=%f\n",z_w);
#endif
point_w[3][0]=(int)((point_w[3][0]<<16)/z_w);
point_w[3][1]=(int)((point_w[3][1]<<16)/z_w);
point_w[3][2]=(int)((point_w[3][2]<<16)/z_w);
d_point[0]=point_w[3][0];
d_point[1]=point_w[3][1];
d_point[2]=point_w[3][2];
#ifdef TEST
printf("d:x=%4d,y=%4d,z=%4d\n",d_point[0],d_point[1],d_point[2]);
#endif
}